/*
 * @(#)Hauptfenster.java
 * 1.0, 2013-01-24
 */
package de.hdm.gruppenkalender.team04.gui;

import de.hdm.gruppenkalender.team04.Tools;
import de.hdm.gruppenkalender.team04.data.Alarm;
import de.hdm.gruppenkalender.team04.data.Kalender;
import de.hdm.gruppenkalender.team04.data.Kategorie;
import de.hdm.gruppenkalender.team04.data.Person;
import de.hdm.gruppenkalender.team04.data.Termin;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.rmi.RemoteException;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

/**
 * Aufbau des Hauptfenster mit den diversen Elementen.
 *
 * @author Mathias Bendel (mb167)
 * @author Björn Fichnter (bf023)
 * @author Stefan Hettich (sh176)
 * @author René Kugel (rk044)
 * @author Mark Leonberger (ml072)
 * @author Marta Przybylski (mp070)
 *
 * @version 1.0, 2013-01-24
 *
 */
public class HauptFenster extends JFrame {

    // Name der Anwendung
    private final String APP_NAME = "Gruppenkalender-Verwaltung";
    private final String PERSON = "Person";
    private final String TERMIN = "Termin";
    private final String KATEGORIE = "Kategorie";
    private final String KALENDER = "Kalender";
    private final String ALARM = "Alarm";
    // Interface Client, der die Verbindung zur Verwaltung herstellt.
    private InterfaceClient ic = InterfaceClient.interfaceClient();
    // aktuelle aktiver Nutzer ggf. auch null (Admin)
    private Person aktuellerNutzer;
    JPanel inhaltsPanel = new JPanel();
    JButton buttonAnlegen;
    JButton buttonBearbeiten;
    JButton buttonLoeschen;
    JScrollPane scrollPaneListe;
    JList listObjekte;
    DefaultListModel listModelObjekte = new DefaultListModel();
    // HashMaps für die jeweiligen JLists
    HashMap<String, Termin> hashMapTermine;
    HashMap<String, Person> hashMapPerson;
    HashMap<String, Kategorie> hashMapKategorie;
    HashMap<String, Kalender> hashMapKalender;
    HashMap<String, Alarm> hashMapAlarme;
    // Timer
    Vector<Timer> timers = new Vector<Timer>();

    /**
     * Konstruktor, ohne Parameter setzt KEINE Person und initialisiert somit
     * den "Admin"-Modus
     */
    public HauptFenster() {
        this(null);
    }

    /**
     * Konstruktor, mit Parameter setzt eine Person und initialisiert somit
     * den "Nutzer"-Modus
     *
     * @param person
     */
    public HauptFenster(Person person) {
        this.aktuellerNutzer = person;

        this.setLocation(30, 30);
        this.erstelleElemente();

        this.initialisiereTimer();
    }

    /**
     * @return  Person  aktuellerNutzer
     */
    public Person getAktuellerNutzer() {
        return aktuellerNutzer;
    }

    /**
     * @param   aktuellerNutzer der gesetzt werden soll.
     */
    public void setAktuellerNutzer(Person aktuellerNutzer) {
        this.aktuellerNutzer = aktuellerNutzer;
    }

    /**
     * Erstellt die Elemente und fügt das Haupt-Fenster zusammen.
     */
    public void erstelleElemente() {
        // Prüfen, ob Nutzer gesetzt.
        if (aktuellerNutzer == null) {
            this.setTitle(APP_NAME + " - Administration");
        } else {
            try {
                this.setTitle(APP_NAME + " - '" + aktuellerNutzer.getVorname() +
                        " " + aktuellerNutzer.getNachname() + "'");
            } catch (RemoteException ex) {
                Logger.getLogger(LoginFenster.class.getName()).log(Level.SEVERE,
                        null, ex);
                this.setTitle(APP_NAME + " - <kein Nutzername>");
            }
        }

        // Haupt-Panel zuordnen.
        this.add(erstelleHauptPanel());

        this.setMinimumSize(new Dimension(640, 480));

        // Anwendung bei Schließen des Fensters beenden.
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Frame packen und anzeigen.
        this.pack();
        this.setVisible(true);
    }

    /**
     * Erstellt das Haupt-Panel und gibt es gefüllt zurück.
     *
     * @return  JPanel  hauptPanel
     */
    public JPanel erstelleHauptPanel() {
        JPanel hauptPanel = new JPanel();

        hauptPanel.setLayout(new BorderLayout());

        // Menüleiste erzeugen

        JMenuBar menueLeiste = new JMenuBar();

        // erstes Menü erzeugen
        JMenu menueDatei = new JMenu("Datei");

        // erstes Untermenü erzeugen
        String strTempAusloggen = "Abmelden";
        if (this.aktuellerNutzer == null) {
            strTempAusloggen = "Administrator abmelden";
        } else {
            try {
                strTempAusloggen = "'" + aktuellerNutzer.getVorname() + " " +
                        aktuellerNutzer.getNachname() + "' abmelden";
            } catch (RemoteException ex) {
                Logger.getLogger(HauptFenster.class.getName()).log(Level.SEVERE,
                        null, ex);
            }
        }
        JMenuItem mItemAusloggen = new JMenuItem(strTempAusloggen);
        mItemAusloggen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (JOptionPane.showConfirmDialog(HauptFenster.this,
                        "Wollen Sie sich wirklich abmelden?", "Abmelden",
                        JOptionPane.YES_NO_OPTION) == 0) {
                    for (Timer timer : timers) {
                        timer.cancel();
                    }
                    new LoginFenster(true);
                    setVisible(false);
                    dispose();
                }
            }
        });
        menueDatei.add(mItemAusloggen);

        menueDatei.addSeparator();

        JMenuItem mItemBeenden = new JMenuItem("Beenden");
        mItemBeenden.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (JOptionPane.showConfirmDialog(HauptFenster.this,
                        "Das Programm wirklich beenden?", "Beenden",
                        JOptionPane.YES_NO_OPTION) == 0) {
                    System.exit(0);
                }
            }
        });
        menueDatei.add(mItemBeenden);

        menueLeiste.add(menueDatei);

        // zweites Menü erzeugen
        JMenu menueVerwalten = new JMenu("Verwaltung");

        // zweites Untermenü erzeugen
        if (aktuellerNutzer == null) {
            // Diese Elemente sind nur in der Admin-Sicht verfügbar.
            JMenuItem mItemPerson = new JMenuItem("Personen verwalten");
            mItemPerson.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    erstellePersonenVerwaltung();
                    aktualisiereSwingKomponenten();
                }
            });
            menueVerwalten.add(mItemPerson);

            JMenuItem mItemKategorie = new JMenuItem("Kategorien verwalten");
            mItemKategorie.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    erstelleKategorienVerwaltung();
                    aktualisiereSwingKomponenten();
                }
            });
            menueVerwalten.add(mItemKategorie);

            menueVerwalten.addSeparator();
        }

        JMenuItem mItemKalender = new JMenuItem("Kalender verwalten");
        mItemKalender.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                erstelleKalenderVerwaltung();
                aktualisiereSwingKomponenten();
            }
        });
        menueVerwalten.add(mItemKalender);

        JMenuItem mItemTermin = new JMenuItem("Termine verwalten");
        mItemTermin.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                erstelleTermineVerwaltung();
                aktualisiereSwingKomponenten();
            }
        });
        menueVerwalten.add(mItemTermin);

        JMenuItem mItemAlarme = new JMenuItem("Alarme verwalten");
        mItemAlarme.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                erstelleAlarmeVerwaltung();
                aktualisiereSwingKomponenten();
            }
        });
        menueVerwalten.add(mItemAlarme);

        menueLeiste.add(menueVerwalten);

        this.setJMenuBar(menueLeiste);

        erstelleTermineVerwaltung();
        hauptPanel.add(this.inhaltsPanel, BorderLayout.CENTER);

        return hauptPanel;
    }

    /**
     * Erstellt die Termin-Verwaltung, dabei wird das Inhalts-Panel
     * neu geschrieben.
     */
    public void erstelleTermineVerwaltung() {
        this.initialisiereInhaltsPanel(TERMIN + "e");

        hashMapTermine = new HashMap<String, Termin>();

        Vector<Termin> termine = new Vector<Termin>();

        if (aktuellerNutzer == null) {
            // Alle Termine anzeigen (von allen Personen)
            termine = ic.ermittleAlleTermine();
        } else {
            // Alle Termine von aktuellem Nutzer.
            termine = ic.ermittleAlleTermineVon(aktuellerNutzer);
        }

        for (Termin termin : termine) {
            try {

                String name = "";
                if (ic.istWiederholung(termin.getId())) {
                    name = termin.ermittleIdentifikationsName(true);
                } else {
                    name = termin.ermittleIdentifikationsName(false);
                }
                listModelObjekte.addElement(name);
                hashMapTermine.put(name, termin);
            } catch (RemoteException ex) {
                Logger.getLogger(HauptFenster.class.getName()).log(Level.SEVERE,
                        null, ex);
            }
        }

        buttonAnlegen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                new DialogTermin(HauptFenster.this);
            }
        });

        buttonBearbeiten.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                int index = listObjekte.getSelectedIndex();
                String name = String.valueOf(
                        listModelObjekte.getElementAt(index));
                new DialogTermin(HauptFenster.this, hashMapTermine.get(name));
            }
        });
        buttonLoeschen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                int index = listObjekte.getSelectedIndex();
                String name = String.valueOf(
                        listModelObjekte.getElementAt(index));

                Termin termin = hashMapTermine.get(name);

                int result = Tools.TERMIN_ABBRECHEN_OPTION;

                try {
                    if (aktuellerNutzer == null ||
                            aktuellerNutzer.getPersonId() == termin.getId()) {
                        result =
                                JOptionPane.showOptionDialog(HauptFenster.this,
                                "Möchten Sie nur diesen Termin oder alle " +
                                "Termine löschen?",
                                TERMIN + " löschen", JOptionPane.DEFAULT_OPTION,
                                JOptionPane.QUESTION_MESSAGE,
                                null, Tools.DIALOG_OPTIONEN_TERMIN,
                                Tools.DIALOG_OPTIONEN_TERMIN[Tools.TERMIN_ABBRECHEN_OPTION]);
                    } else {
                        result =
                                JOptionPane.showOptionDialog(HauptFenster.this,
                                "Möchten Sie die Teilnahme an diesen " +
                                "Termin oder an alle Terminen löschen?",
                                TERMIN + " löschen", JOptionPane.DEFAULT_OPTION,
                                JOptionPane.QUESTION_MESSAGE,
                                null, Tools.DIALOG_OPTIONEN_TERMIN,
                                Tools.DIALOG_OPTIONEN_TERMIN[Tools.TERMIN_ABBRECHEN_OPTION]);
                    }
                } catch (RemoteException ex) {
                    Logger.getLogger(HauptFenster.class.getName()).
                            log(Level.SEVERE, null, ex);
                }

                if (result == Tools.TERMIN_DIESER_OPTION) {
                    ic.loescheTermin(termin, aktuellerNutzer, false);
                    // Wenn Termin gelöscht, ersten aus JList anzeigen.
                    erstelleTermineVerwaltung();
                    aktualisiereSwingKomponenten();
                    initialisiereTimer();

                } else if (result == Tools.TERMIN_ALLE_OPTION) {
                    ic.loescheTermin(termin, aktuellerNutzer, true);
                    // Wenn Termin gelöscht, ersten aus JList anzeigen.
                    erstelleTermineVerwaltung();
                    aktualisiereSwingKomponenten();
                    initialisiereTimer();
                }
            }
        });

        listObjekte.addMouseMotionListener(new MouseMotionListener() {

            public void mouseDragged(MouseEvent e) {
            }

            /**
             * MouseMotionListener erfasst die Position der Mouse und erstellt einen ToolTip zum Element der JList über der der Mauszeiger positioniert ist
             */
            public void mouseMoved(MouseEvent e) {
                int index = listObjekte.locationToIndex(e.getPoint());
                if (listModelObjekte.isEmpty()) {
                } else {
                    if (index > -1) {
                        listObjekte.setToolTipText(null);
                        String text = (String) listModelObjekte.getElementAt(
                                index);
                        try {
                            listObjekte.setToolTipText(
                                    "<html><head></head><body>Titel: " +
                                    hashMapTermine.get(text).getTitel() +
                                    "<br />Beschreibung: " +
                                    hashMapTermine.get(text).getBeschreibung() +
                                    "<br />Ort: " + hashMapTermine.get(text).
                                    getOrt() + "</body></html>");
                        } catch (RemoteException ex) {
                            Logger.getLogger(HauptFenster.class.getName()).log(
                                    Level.SEVERE, null, ex);
                        }
                    }
                }

            }
        });

        listObjekte.addListSelectionListener(new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {
                if (e.getValueIsAdjusting() == false) {
                    if (listObjekte.getSelectedIndex() == -1) {
                        buttonLoeschen.setEnabled(false);
                        buttonBearbeiten.setEnabled(false);
                    } else {
                        buttonLoeschen.setEnabled(true);
                        buttonBearbeiten.setEnabled(true);
                    }
                    if (aktuellerNutzer != null) {
                        Termin t = hashMapTermine.get(String.valueOf(
                                listObjekte.getSelectedValue()));

                        try {
                            if (t.getErstellerId() ==
                                    aktuellerNutzer.getPersonId()) {
                                buttonBearbeiten.setEnabled(true);
                            } else {
                                buttonBearbeiten.setEnabled(false);
                            }
                        } catch (RemoteException ex) {
                            Logger.getLogger(HauptFenster.class.getName()).
                                    log(Level.SEVERE, null, ex);
                        }
                    }
                }
            }
        });

        this.finalisiereInhaltPanel(TERMIN);
    }

    /**
     * Erstellt die Personen-Verwaltung, dabei wird das Inhalts-Panel
     * neu geschrieben.
     */
    public void erstellePersonenVerwaltung() {
        this.initialisiereInhaltsPanel(PERSON + "en");

        hashMapPerson = new HashMap<String, Person>();

        Vector<Person> personen = new Vector<Person>();

        personen = ic.ermittleAllePersonen();

        for (Person person : personen) {
            String name = "";
            try {
                name = person.ermittleIdentifikationsName();
            } catch (RemoteException ex) {
                Logger.getLogger(HauptFenster.class.getName()).
                        log(Level.SEVERE, null, ex);
            }
            listModelObjekte.addElement(name);
            hashMapPerson.put(name, person);
        }

        buttonAnlegen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                new DialogPerson(HauptFenster.this);
            }
        });

        buttonBearbeiten.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                int index = listObjekte.getSelectedIndex();
                String name = String.valueOf(
                        listModelObjekte.getElementAt(index));
                new DialogPerson(HauptFenster.this, hashMapPerson.get(name));
            }
        });

        buttonLoeschen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                int index = listObjekte.getSelectedIndex();
                String name = String.valueOf(
                        listModelObjekte.getElementAt(index));

                if (JOptionPane.showConfirmDialog(HauptFenster.this, PERSON +
                        " '" + name + "' wirklich löschen?", PERSON + " löschen",
                        JOptionPane.YES_NO_OPTION) == 0) {
                    Person person = hashMapPerson.get(name);
                    ic.loeschePerson(person);
                    listModelObjekte.remove(index);
                }
            }
        });

        this.finalisiereInhaltPanel(PERSON);
    }

    /**
     * Erstellt die Kategorien-Verwaltung, dabei wird das Inhalts-Panel
     * neu geschrieben.
     */
    public void erstelleKategorienVerwaltung() {
        this.initialisiereInhaltsPanel(KATEGORIE + "n");

        hashMapKategorie = new HashMap<String, Kategorie>();

        Vector<Kategorie> kategorien = new Vector<Kategorie>();

        kategorien = ic.ermittleAlleKategorien();

        for (Kategorie kategorie : kategorien) {
            try {
                String name = kategorie.ermittleIdentifikationsName();
                listModelObjekte.addElement(name);
                hashMapKategorie.put(name, kategorie);
            } catch (RemoteException ex) {
                Logger.getLogger(LoginFenster.class.getName()).log(Level.SEVERE,
                        null, ex);
            }
        }

        buttonAnlegen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                new DialogKategorie(HauptFenster.this);
            }
        });

        buttonBearbeiten.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                int index = listObjekte.getSelectedIndex();
                String name = String.valueOf(
                        listModelObjekte.getElementAt(index));
                new DialogKategorie(HauptFenster.this,
                        hashMapKategorie.get(name));
            }
        });

        buttonLoeschen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                int index = listObjekte.getSelectedIndex();
                String name = String.valueOf(
                        listModelObjekte.getElementAt(index));
                // Kategorie löschen.
                if (JOptionPane.showConfirmDialog(HauptFenster.this, KATEGORIE +
                        " '" + name + "' wirklich löschen?", KATEGORIE +
                        " löschen", JOptionPane.YES_NO_OPTION) == 0) {
                    Kategorie kategorie = hashMapKategorie.get(name);
                    ic.loescheKategorie(kategorie);
                    listModelObjekte.remove(index);
                }
            }
        });


        this.finalisiereInhaltPanel(KATEGORIE);
    }

    /**
     * Erstellt die Kalender-Verwaltung, dabei wird das Inhalts-Panel
     * neu geschrieben.
     */
    public void erstelleKalenderVerwaltung() {
        this.initialisiereInhaltsPanel(KALENDER);

        hashMapKalender = new HashMap<String, Kalender>();

        Vector<Kalender> kalenders = new Vector<Kalender>();

        if (aktuellerNutzer == null) {
            kalenders = ic.ermittleAlleKalender();
        } else {
            kalenders = ic.ermittleAlleKalenderVon(aktuellerNutzer);
        }

        for (Kalender kalender : kalenders) {
            String name = "";
            try {
                name = kalender.ermittleIdentifikationsName();
            } catch (RemoteException ex) {
                Logger.getLogger(HauptFenster.class.getName()).
                        log(Level.SEVERE, null, ex);
            }
            listModelObjekte.addElement(name);
            hashMapKalender.put(name, kalender);
        }

        buttonAnlegen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                new DialogKalender(HauptFenster.this);
            }
        });

        buttonBearbeiten.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                int index = listObjekte.getSelectedIndex();
                String name = String.valueOf(
                        listModelObjekte.getElementAt(index));
                new DialogKalender(HauptFenster.this, hashMapKalender.get(name));
            }
        });

        buttonLoeschen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                int index = listObjekte.getSelectedIndex();
                String name = String.valueOf(
                        listModelObjekte.getElementAt(index));
                // Kalender löschen.
                if (JOptionPane.showConfirmDialog(HauptFenster.this, KALENDER +
                        " '" + name + "' wirklich löschen?", KALENDER +
                        " löschen", JOptionPane.YES_NO_OPTION) == 0) {
                    Kalender kalender = hashMapKalender.get(name);
                    ic.loescheKalender(kalender);
                    listModelObjekte.remove(index);
                }
            }
        });

        this.finalisiereInhaltPanel(KALENDER);
    }

    /**
     * Erstellt die Alarme-Verwaltung, dabei wird das Inhalts-Panel
     * neu geschrieben.
     */
    public void erstelleAlarmeVerwaltung() {
        this.initialisiereInhaltsPanel(ALARM + "e");

        hashMapAlarme = new HashMap<String, Alarm>();

        Vector<Alarm> alarme = new Vector<Alarm>();

        if (aktuellerNutzer == null) {
            alarme = ic.ermittleAlleAlarme();
        } else {
            alarme = ic.ermittleAlleAlarmeVon(aktuellerNutzer);
        }

        for (Alarm alarm : alarme) {
            String name = "";
            try {
                name = alarm.ermittleIdentifikationsName();
            } catch (RemoteException ex) {
                Logger.getLogger(HauptFenster.class.getName()).
                        log(Level.SEVERE, null, ex);
            }
            listModelObjekte.addElement(name);
            hashMapAlarme.put(name, alarm);
        }

        buttonAnlegen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                new DialogAlarm(HauptFenster.this);
            }
        });

        buttonBearbeiten.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                int index = listObjekte.getSelectedIndex();
                String name = String.valueOf(
                        listModelObjekte.getElementAt(index));
                new DialogAlarm(HauptFenster.this, hashMapAlarme.get(name));
            }
        });

        buttonLoeschen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                int index = listObjekte.getSelectedIndex();
                String name = String.valueOf(
                        listModelObjekte.getElementAt(index));
                // Alarm löschen.
                if (JOptionPane.showConfirmDialog(HauptFenster.this, ALARM +
                        " '" + name + "' wirklich löschen?", ALARM +
                        " löschen", JOptionPane.YES_NO_OPTION) ==
                        JOptionPane.YES_OPTION) {
                    Alarm alarm = hashMapAlarme.get(name);
                    ic.loescheAlarm(alarm);
                    listModelObjekte.remove(index);
                    initialisiereTimer();
                }
            }
        });

        listObjekte.addListSelectionListener(new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {
                if (e.getValueIsAdjusting() == false) {
                    if (listObjekte.getSelectedIndex() == -1) {
                        buttonLoeschen.setEnabled(false);
                    } else {
                        buttonLoeschen.setEnabled(true);
                    }

                    if (aktuellerNutzer != null && ((JList) e.getSource()).
                            getSelectedIndex() != -1) {
                        Alarm a = hashMapAlarme.get(String.valueOf(
                                listObjekte.getSelectedValue()));

                        try {
                            if (a.getErstellerId() ==
                                    aktuellerNutzer.getPersonId()) {
                                buttonBearbeiten.setEnabled(true);
                            } else {
                                buttonBearbeiten.setEnabled(false);
                            }
                        } catch (RemoteException ex) {
                            Logger.getLogger(HauptFenster.class.getName()).
                                    log(Level.SEVERE, null, ex);
                        }
                    }
                }
            }
        });

        this.finalisiereInhaltPanel(ALARM);
    }

    /**
     * Initialisiert das anlegen eines neuen Inhalts-Panels.
     * Der vorherige Inhalt wird zunächst gelöscht und die
     * Grundstruktur (Buttons, etc.) werden angelegt.
     * 
     * @param   namePlural  Name des Bereichs (Pluaral z.B.: Termine)
     */
    public void initialisiereInhaltsPanel(String namePlural) {
        // Inhalts-Panel leeren.
        this.inhaltsPanel.removeAll();

        inhaltsPanel.setLayout(new BorderLayout());

        JPanel panelButton = new JPanel();
        panelButton.setLayout(new GridLayout(1, 3, 10, 0));
        // Abstand nach außen erzeugen.
        panelButton.setBorder(new EmptyBorder(10, 10, 10, 10));

        buttonAnlegen = new JButton("Anlegen");
        panelButton.add(buttonAnlegen);

        buttonBearbeiten = new JButton("Bearbeiten");
        panelButton.add(buttonBearbeiten);

        buttonLoeschen = new JButton("Löschen");
        panelButton.add(buttonLoeschen);

        inhaltsPanel.add(panelButton, BorderLayout.SOUTH);

        listModelObjekte = new DefaultListModel();

        listObjekte = new JList(listModelObjekte);

        inhaltsPanel.add(new JLabel("<html><h2>" + namePlural +
                " verwalten</h2></html>", JLabel.CENTER), BorderLayout.NORTH);
    }

    /**
     * Eine neue JList wird mit dem vorher gefüllten ListModel erzeugt
     * und hinzugefügt.
     *
     * @param   nameSingular    Name des Bereichs (Singular z.B.: Termin)
     */
    public void finalisiereInhaltPanel(String nameSingular) {


        // Nur einfache Auswahl möglich.
        listObjekte.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        // ...
        if (!nameSingular.equals(TERMIN) && !nameSingular.equals(ALARM)) {
            listObjekte.addListSelectionListener(new ListSelectionListener() {

                public void valueChanged(ListSelectionEvent e) {
                    if (e.getValueIsAdjusting() == false) {
                        if (listObjekte.getSelectedIndex() == -1) {
                            buttonLoeschen.setEnabled(false);
                            buttonBearbeiten.setEnabled(false);
                        } else {
                            buttonLoeschen.setEnabled(true);
                            buttonBearbeiten.setEnabled(true);
                        }
                    }
                }
            });
        }

        // Erstes Element auswählen.
        listObjekte.setSelectedIndex(0);

        scrollPaneListe = new JScrollPane(listObjekte);

        inhaltsPanel.add(scrollPaneListe, BorderLayout.CENTER);

        if (listModelObjekte.size() == 0) {
            buttonLoeschen.setEnabled(false);
            buttonBearbeiten.setEnabled(false);
        }

    }

    /**
     * Setzt den aktuellen Index der Liste,
     * entsprechend eines übergebenen String der in der Liste angezeigt wird.
     *
     * @param   name    String des Listenelements, das gesetzt werden soll.
     */
    public void setzteListIndex(String name) {
        listObjekte.setSelectedIndex(listModelObjekte.indexOf(name));
    }

    /**
     * Aktualisiert den JFrame HauptFenster.
     */
    public void aktualisiereSwingKomponenten() {
        SwingUtilities.updateComponentTreeUI(this);
    }

    /**
     * Initialisiert die Timer zur Anzeige von Alarm- und Erninnerungs-
     * Benachrichtigungen.
     */
    public void initialisiereTimer() {
        if (aktuellerNutzer != null) {
            timers = new Vector<Timer>();
            Vector<Alarm> alarme = ic.ermittleAlleAlarmeVon(aktuellerNutzer);
            for (Alarm alarm : alarme) {
                try {
                    Timestamp start = alarm.getStart();

                    Timestamp jetzt = new Timestamp(Calendar.getInstance().
                            getTime().
                            getTime());

                    if (jetzt.before(start)) {
                        // Schauen, ob Alarm nach dem jetztigen Zeitpunkt ist.
                        Timer timer = new Timer();
                        timer.schedule(new ErinnerungsTask(alarm.getTitel(),
                                alarm.getGueltigFuerId()), start);
                        timers.add(timer);
                    }
                } catch (RemoteException ex) {
                    Logger.getLogger(HauptFenster.class.getName()).
                            log(Level.SEVERE, null, ex);
                }
            }
            System.out.println("Aktive Alarme: " + timers.size());
        }
    }

    /**
     * TimerTask, der beim Auslösen eines Timers aufgerufen wird.
     */
    private class ErinnerungsTask extends TimerTask {

        String text = "";

        public ErinnerungsTask(String name, int gueltigFuer) {
            if (gueltigFuer != 0) {
                Termin termin = ic.ermittleTerminViaSchluessel(gueltigFuer);

                if (!name.equals("Erinnerung")) {
                    text = "Erinnerung '" + name + "' für Termin '";
                }
                try {
                    text += termin.getTitel();
                } catch (RemoteException ex) {
                    Logger.getLogger(HauptFenster.class.getName()).
                            log(Level.SEVERE, null, ex);
                }
                text += "'";
            } else {
                text = name;
            }
        }

        @Override
        public void run() {
            AudioInputStream audioIn = null;
            try {
                File myAudioFile = new File("alarm.wav");
                audioIn = AudioSystem.getAudioInputStream(myAudioFile);
                Clip clip = AudioSystem.getClip();
                clip.open(audioIn);
                clip.start();
                JOptionPane.showMessageDialog(HauptFenster.this, text);
            } catch (LineUnavailableException ex) {
                Logger.getLogger(HauptFenster.class.getName()).log(Level.SEVERE,
                        null, ex);
            } catch (UnsupportedAudioFileException ex) {
                Logger.getLogger(HauptFenster.class.getName()).log(Level.SEVERE,
                        null, ex);
            } catch (IOException ex) {
                Logger.getLogger(HauptFenster.class.getName()).log(Level.SEVERE,
                        null, ex);
            } finally {
                try {
                    audioIn.close();
                } catch (IOException ex) {
                    Logger.getLogger(HauptFenster.class.getName()).log(
                            Level.SEVERE, null, ex);
                }
            }
        }
    }
}
